package com.nfit.shopadmin.utils;

import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * ClassName:RedisIdWorker
 * Package:com.nfit.shopadmin.utils
 * Description
 *
 * 订单唯一id生成器
 *
 * @Author L
 * @Create 2025/1/6 19:22
 */
@Component
public class RedisIdWorker {

    /**
     * 开始时间戳
     */
    private static final long BEGIN_TIMESTAMP = 1704067200L;
    /**
     * 序列号位数
     */
    private static final long COUNT_BITS = 32;

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 业务前缀 ,比如订单业务，就传order
     * @param keyPrefix 前缀
     */
    public long nextId(String keyPrefix){
        //获取当前时间戳
        long nowSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        //当前时间戳 - 开始时间戳
        long timestamp = nowSecond - BEGIN_TIMESTAMP;
        //生成序列号
        //获取当前日期精确到天
        //细节：如果想统计月或一天的销售量,可以获取yyyy:MM or yyyy:MM:dd  的key
        String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        //用于生成当天的自增序列号
        //stringRedisTemplate.opsForValue().increment() 是 Redis 操作模板的一种方法，表示对 Redis 中某个键的值进行自增操作。
        // 如果该键不存在，Redis 会自动创建并将该键的初始值设置为 0，然后执行自增操作。
        long count = redisTemplate.opsForValue().increment("icr" + keyPrefix + ":" + date);
        //并接并返回
        return timestamp << COUNT_BITS | count;
    }

//    public static void main(String[] args) {
//        //创建一个 LocalDateTime 对象，表示 2024年1月1日 00:00:00
//        LocalDateTime localDateTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
//        // 获取秒，使用 ZoneOffset.UTC 来指定时区为 UTC
//        long s = localDateTime.toEpochSecond(ZoneOffset.UTC);
//        // 打印秒数
//        //输出自 1970-01-01 00:00:00 UTC 到 2024-01-01 00:00:00 UTC 之间的秒数。
//        System.out.println(s);
//    }
}
